﻿using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using Npgsql;

namespace Golfvision2020
{
    public partial class RegistreraUppdatera : Form
    {

        // Vi tar in förälder-formen så att vi kan komma åt databaskopplingen och markerad spelare i spellistan
        private Spelare Spelarform;

        public RegistreraUppdatera(Spelare spelarform)
        {
            Spelarform = spelarform;
            InitializeComponent();

            // Om en medlem är markerad så uppdaterar vi spelaren
            if (Spelarform.Spelarlista.SelectedItems.Count == 1)
            {
                // Lägg in uppgifterna från databasen i textfälten
                AddSpelareToForm();
                getStatusFromDB();
                getStatusIdDB();
            }

        }

        public void getStatusIdDB()
        {
            NpgsqlCommand command = new NpgsqlCommand("select status_id from status", Spelarform.Klubben.conn); //Ett commandobjekt skapas och knyts till ett sql-uttryck och en db-koppling
            NpgsqlDataReader dr = command.ExecuteReader();  //Kommandot körs och resultatet läggs i ett datareader-objekt
            while (dr.Read()) //En loop som rad för rad läser innehållet i datareader'n
            {
               StatusCombobox.Items.Add(dr["status_id"].ToString());
            }
            StatusCombobox.SelectedIndex = 0;

            dr.Close();
        }

        public void getStatusFromDB()
        {
            String medlemsId = Spelarform.Spelarlista.SelectedItems[0].Text;
            NpgsqlCommand command = new NpgsqlCommand("select status, spelare.status_id from status, spelare WHERE spelare.status_id = status.status_id AND golf_id = " + medlemsId + ";", Spelarform.Klubben.conn); //Ett commandobjekt skapas och knyts till ett sql-uttryck och en db-koppling
            NpgsqlDataReader dr = command.ExecuteReader();  //Kommandot körs och resultatet läggs i ett datareader-objekt
            while (dr.Read()) //En loop som rad för rad läser innehållet i datareader'n
            {
                StatusCombobox.Items.Add(dr["status_id"].ToString());
            }

            dr.Close();
        }

        public void getStatusFromDBNewPerson()
        {
            
            NpgsqlCommand command = new NpgsqlCommand("select status_id, status from status ", Spelarform.Klubben.conn); //Ett commandobjekt skapas och knyts till ett sql-uttryck och en db-koppling
            NpgsqlDataReader dr = command.ExecuteReader();  //Kommandot körs och resultatet läggs i ett datareader-objekt
            while (dr.Read()) //En loop som rad för rad läser innehållet i datareader'n
            {
                StatusCombobox.Items.Add(dr["status_id"].ToString());
                status.Text = (dr["status"].ToString());
            }
            StatusCombobox.SelectedIndex = 0;
            dr.Close();
        }

        private void AddSpelareToForm()
        {
            // Hämta spelare från databasen och lägg in i textfälten
            String medlemsId = Spelarform.Spelarlista.SelectedItems[0].Text;
            String getMedlemSql = "SELECT handicap, adress_id, first_name, last_name, telefon, personnummer FROM spelare WHERE golf_id = " + medlemsId + ";";

            NpgsqlCommand command = new NpgsqlCommand(getMedlemSql, Spelarform.Klubben.conn);
            NpgsqlDataReader dr = command.ExecuteReader();
            dr.Read();
            FörnamnText.Text = dr["first_name"].ToString();
            EfternamnText.Text = dr["last_name"].ToString();
            PersonnrText.Text = dr["personnummer"].ToString();
            TelefonText.Text = dr["telefon"].ToString();
            HandicapText.Text = dr["handicap"].ToString();

            String getAddrSql = "SELECT gatuadress, postnummer, stad, stad.stad_id FROM adress, stad WHERE adress.stad_id = stad.stad_id AND adress_id = " + dr["adress_id"].ToString() + ";";
            dr.Close(); // stäng föregående datareader (annars kan den inte återanvändas)            
            command = new NpgsqlCommand(getAddrSql, Spelarform.Klubben.conn);
            dr = command.ExecuteReader();
            dr.Read();

            AdressText.Text = dr["gatuadress"].ToString();
            PostnrText.Text = dr["postnummer"].ToString();
            PostortText.Text = dr["stad"].ToString();
                       
            dr.Close();
        }
        
        private void Avbryt2Button_Click(object sender, EventArgs e)//Avbryter de pågående handlingarna
        {
            this.Close();
        }

        private void ReggaSpelareButton_Click(object sender, EventArgs e)
        {
            // Om ingen är markerad så registrerar vi en ny spelare
            if (Spelarform.Spelarlista.SelectedItems.Count < 1)
            {
                RegistreraMedlem();
            }
            else
            {
                UppdateraMedlem();
            }
        }

        private void UppdateraMedlem() //Uppdaterar en spelare i databasen
        {
            if (!KontrolleraTextboxar())
                return;
            
            String addressId = RegistreraAdress() ; //Hämtar upp all information som ska läggas in i respektive kolumn i databasen
            String Datum = DateTime.Now.ToString("yyyy-MM-dd");

            String UppdateraSql = "UPDATE spelare SET "
                + "personnummer= " + PersonnrText.Text + ", "
                + "adress_id= '" + addressId + "', "
                + "handicap= '" + HandicapText.Text + "', "
                + "telefon= '" + TelefonText.Text + "', "
                + "senast_uppdaterad='" + Datum + "', "
                + "status_id='" + StatusCombobox.SelectedItem + "', "
                + "first_name='" + FörnamnText.Text + "', " 
                + AddLosenSql()
                + "last_name='" + EfternamnText.Text + "' WHERE golf_id = " + Spelarform.Spelarlista.SelectedItems[0].Text + ";";

            NpgsqlCommand command = new NpgsqlCommand(UppdateraSql, Spelarform.Klubben.conn);


            int antalposter = command.ExecuteNonQuery();
            if (antalposter != 1)
            {
                MessageBox.Show("Gick ej att uppdatera spelare");
            }
            else
            {
                MessageBox.Show("Spelaren uppdaterades");
            }

            // Uppdatera spelarlistan
            Spelarform.GetMedlemmarFromDB();

            this.Close();
        }

        private void RegistreraMedlem()
        {
            if (!KontrolleraTextboxar())
                return;

            if (LosenBox.Text.Length < 4)
            {
                MessageBox.Show("Lösenordet får inte vara kortare än 4 tecken");
                return;
            }

            String addressId = RegistreraAdress();
            String Datum = DateTime.Now.ToString("yyyy-MM-dd");
                        
            string sql = "INSERT INTO spelare( "
                + "personnummer, adress_id, handicap, telefon, senast_uppdaterad, status_id, first_name, last_name, losenord) "
                + "VALUES (" + PersonnrText.Text + ", "
                + addressId + ", "
                + HandicapText.Text + ", "
                + TelefonText.Text + ", '"
                + Datum + "', '"
                + StatusCombobox.SelectedItem + "', '"
                + FörnamnText.Text + "', '"
                + EfternamnText.Text + "', '"
                + GetMD5Hash(LosenBox.Text) + "');";
           

            NpgsqlCommand command = new NpgsqlCommand(sql, Spelarform.Klubben.conn);
           

            int antalposter = command.ExecuteNonQuery();
            if (antalposter != 1)
            {
                MessageBox.Show("Gick ej att lägga till spelare");
            }
            else
            {
                MessageBox.Show("Spelaren lades till");
            }

            // Uppdatera spelarlistan
            Spelarform.GetMedlemmarFromDB();

            this.Close();
        }


        // Lägger till addressen om den inte redan finns och returnerar adress_id
        private String RegistreraAdress()
        {
            String stadId = RegistreraStad();
            if (stadId == "")
                return "";

            String adressId = "";
            
            String getAddrIdSql = "SELECT adress_id FROM adress WHERE "
            + "stad_id = " + stadId + " AND "
            + "lower(gatuadress) LIKE lower('" + AdressText.Text + "') limit 1;";
            NpgsqlCommand command = new NpgsqlCommand(getAddrIdSql, Spelarform.Klubben.conn);
            NpgsqlDataReader dr = command.ExecuteReader();
            dr.Read();


            // Om adressen inte redan finns, lägg till den
            if (!dr.HasRows)
            {
                dr.Close();

                string registreraAdress = "INSERT INTO adress(stad_id, "
                   + "gatuadress, senast_uppdaterad) "
                   + "VALUES (" + stadId + ", '" + AdressText.Text + "', '" + DateTime.Now + "');";

                command = new NpgsqlCommand(registreraAdress, Spelarform.Klubben.conn);

                int antalposter = command.ExecuteNonQuery();
                if (antalposter == 1)
                {
                    // Hämta ut det nya id:t från databasen
                    command = new NpgsqlCommand(getAddrIdSql, Spelarform.Klubben.conn);
                    dr = command.ExecuteReader();
                    dr.Read();
                    adressId = dr["adress_id"].ToString();
                }
                dr.Close();
            }
            else
            {
                adressId = dr["adress_id"].ToString();
                dr.Close();
            }
            return adressId;
        }
        // Lägger till staden om den inte redan finns och returnerar stad_id
        private String RegistreraStad()
        {
            String getStadIdSql = "SELECT stad_id FROM stad WHERE lower(stad) LIKE lower('" + PostortText.Text + "') limit 1;";
            NpgsqlCommand command = new NpgsqlCommand(getStadIdSql, Spelarform.Klubben.conn);
            NpgsqlDataReader dr = command.ExecuteReader();
            dr.Read();

            String stadId = "";

            // Om staden inte redan finns, lägg till den
            if (!dr.HasRows)
            {
                dr.Close();

                string registreraStad = "INSERT INTO stad( "
                   + "stad, postnummer, senast_uppdaterad) "
                   + "VALUES ('" + PostortText.Text + "', " + PostnrText.Text + ", '"
                   + DateTime.Now + "');";

                command = new NpgsqlCommand(registreraStad, Spelarform.Klubben.conn);

                int antalposter = command.ExecuteNonQuery();
                if (antalposter == 1)
                {
                    // Hämta ut det nya id:t från databasen
                    command = new NpgsqlCommand(getStadIdSql, Spelarform.Klubben.conn);
                    dr = command.ExecuteReader();
                    dr.Read();
                    stadId = dr["stad_id"].ToString();
                }
                dr.Close();
            }
            else
            {
                stadId = dr["stad_id"].ToString();
                dr.Close();
            }
            return stadId;
        }

                       
        private bool KontrolleraTextboxar()
        {
            List<TextBox> Textboxar = new List<TextBox>();
            Textboxar.Add(FörnamnText);
            Textboxar.Add(EfternamnText);
            Textboxar.Add(AdressText);
            Textboxar.Add(PostortText);
            Textboxar.Add(PostnrText);
            Textboxar.Add(PersonnrText);
            Textboxar.Add(TelefonText);
            Textboxar.Add(HandicapText);
            
            foreach (TextBox b in Textboxar)
            {
                // TA bort alla mellanslag ut textboxarna
                b.Text = b.Text.Trim();
                if (b.Text.Length < 1 && b != LosenBox)
                {
                    MessageBox.Show("Textboxen får inte vara tom");
                    b.Select();
                    return false;
                }
                // Kolla så att boxarna inte innehåller specialtecken
                else if (Regex.Match(b.Text, @"[^a-zåäöA-ZÅÄÖ0-9\s]").Success)
                {
                    MessageBox.Show("Textboxen får inte innehålla specialtecken eller blanksteg");
                    b.Select();
                    return false;
                }
            }

            if (StatusCombobox.Text.Length < 1)
            {
                MessageBox.Show("Du måste välja ett statusalternativ i rullgardinen för status!");
                return false;
            }
            
            double Num;
            if (!double.TryParse(PersonnrText.Text, out Num) ||
                !double.TryParse(PostnrText.Text, out Num) ||
                !double.TryParse(HandicapText.Text, out Num) ||
                !double.TryParse(TelefonText.Text, out Num))
            {
                MessageBox.Show("Postnummer, telefon, handicap och personnummer måste vara siffror.");
                return false;
            }

            if (Convert.ToInt32(HandicapText.Text) < 0 || Convert.ToInt32(HandicapText.Text) > 100)
            {
                MessageBox.Show("Handicap får bara vara mellan 0 och 100");
                HandicapText.Select();
                return false;
            }
            return true;
        }

                           
        private void StatusCombobox_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Hämtar upp information om registrerade personer i databsen beroende på vad som väljs i dropdownlistan
            NpgsqlCommand command = new NpgsqlCommand("select status from status where Status.status_id = (@status);", Spelarform.Klubben.conn); //Ett commandobjekt skapas och knyts till ett sql-uttryck och en db-koppling
            command.Parameters.AddWithValue("@status", this.StatusCombobox.SelectedItem);
            NpgsqlDataReader dr = command.ExecuteReader();  //Kommandot körs och resultatet läggs i ett datareader-objekt

            while (dr.Read()) //En loop som rad för rad läser innehållet i datareader'n
            {

                status.Text = (dr["status"].ToString());

            }
            dr.Close();
        }

        private String AddLosenSql() //Hämtar vald lösen och genomför kryptering av detta innan det sedan skickas till registrera/uppdatera medlem för att sedan läggas in i databasen
        {
            if (LosenBox.Text == "") {
                return "";
            }
            else {
                return " losenord='" + GetMD5Hash(LosenBox.Text) + "', ";
            }
        }

        public string GetMD5Hash(string input)
        {
            System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] bs = System.Text.Encoding.UTF8.GetBytes(input);
            bs = x.ComputeHash(bs);
            System.Text.StringBuilder s = new System.Text.StringBuilder();
            foreach (byte b in bs)
            {
                s.Append(b.ToString("x2").ToLower());
            }
            string password = s.ToString();
            return password;
        }

    }
}
